/**
 * @作者 伟子涵
 * @微信公号 搬砖暗夜码农
 * @开源项目 $ https://gitee.com/zhouwei5208888
 * @我的博客 $ http://itzhouwei.com
 * @创建时间 2023/12/20  16:56
 */
package com.itzhouwei.minis.context;

import com.itzhouwei.minis.beans.BeanDefinition;
import com.itzhouwei.minis.beans.BeansException;
import com.itzhouwei.minis.beans.factory.BeanFactory;
import com.itzhouwei.minis.beans.factory.SimpleBeanFactory;
import com.itzhouwei.minis.beans.factory.xml.XmlBeanDefinitionReader;
import com.itzhouwei.minis.core.ClassPathXmlResource;
import com.itzhouwei.minis.core.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description:
 * @author：zw，微信：yingshengzw
 * @date: 2023/12/20  16:56
 * @Copyright： 公众号：搬砖暗夜码农 | 博客：https://itzhouwei.com - 沉淀、分享、成长，让自己和他人都能有所收获！
 */
@SuppressWarnings("all")
@Slf4j
public class ClassPathXmlApplicationContext implements BeanFactory {

    BeanFactory beanFactory;

    public ClassPathXmlApplicationContext(String fileName) {
        Resource resource = new ClassPathXmlResource(fileName);
        BeanFactory beanFactory = new SimpleBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        reader.loadBeanDefinitions(resource);
        this.beanFactory = beanFactory;
    }


    @Override
    public Object getBean(String beanName) throws BeansException {
        return this.beanFactory.getBean(beanName);
    }

    @Override
    public void registerBeanDefinition(BeanDefinition beanDefinition) {
             this.beanFactory.registerBeanDefinition(beanDefinition);
    }



// 第一版本
//    private List<BeanDefinition> beanDefinitions = new ArrayList<>();
//    private Map<String, Object> singletons = new HashMap<>();
//
//    //构造器获取外部配置，解析出Bean的定义，形成内存映像
//    public ClassPathXmlApplicationContext(String fileName) {
//        this.readXml(fileName);
//        this.instanceBeans();
//    }
//
//
//    /***
//     * 读取XML文件，获取Bean的定义信息
//     * @param fileName
//     */
//    private void readXml(String fileName) {
//        // 创建一个SAXReader对象用于读取XML文件
//        SAXReader saxReader = new SAXReader();
//        try {
//            // 获取XML文件的路径
//            URL xmlPath = this.getClass().getClassLoader().getResource(fileName);
//            // 读取XML文件并返回一个Document对象
//            Document document = saxReader.read(xmlPath);
//            // 获取根元素
//            Element rootElement = document.getRootElement();
//            // 遍历根元素的子元素
//            for (Element element : (List<Element>) rootElement.elements()) {
//                // 获取元素的id属性和class属性值
//                String beanId = element.attributeValue("id");
//                String beanClass = element.attributeValue("class");
//                // 创建一个BeanDefinition对象，保存Bean的基本信息
//                BeanDefinition beanDefinition = new BeanDefinition(beanId, beanClass);
//                // 将Bean的定义存放到beanDefinitions列表中
//                beanDefinitions.add(beanDefinition);
//            }
//        } catch (DocumentException e) {
//            // 捕获DocumentException异常并抛出运行时异常
//            throw new RuntimeException(e);
//        }
//    }
//
//    /***
//     * 利用反射创建Bean实例，并存储在singletons中
//     */
//    private void instanceBeans() {
//        for (BeanDefinition beanDefinition : beanDefinitions) {
//            try {
//                // 利用反射创建Bean实例
//                // 将Bean实例存放到singletons中
//                singletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());
//            } catch (Exception e) {
//                // 捕获异常并抛出运行时异常
//                throw new RuntimeException(e);
//            }
//        }
//    }
//
//    /***
//     * 这是对外的一个方法，让外部程序从容器中获取Bean实例，会逐步演化成核心方法
//     * @param beanName
//     * @return
//     */
//    public Object getBean(String beanName) {
//        return singletons.get(beanName);
//    }

}
